// Copyright 2013 Ronald Schlenker, www.technewlogic.de.
// 
// This file is part of Byond.
// 
// Byond is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
// 
// Byond is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with Byond.  If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;
using Byond.UIRuntime;
using Utils.Documentation;
using System.Linq;

namespace Byond.PatchUiControls
{
	[Doc]
	public class ListBox : UiControl
	{
		static ListBox()
		{
			DefaultStyleKeyProperty.OverrideMetadata(
				typeof(ListBox),
				new FrameworkPropertyMetadata(typeof(ListBox)));
		}

		public ListBox()
		{
			Items = new ObservableCollection<EnumViewModel>();
			Values = "default";
		}

		private string _values;
		[Doc]
		public string Values
		{
			get { return _values; }
			set
			{
				_values = string.IsNullOrWhiteSpace(value)
					? "default"
					: value;

				Items.Clear();
				_values
					.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
					.SelectMany(it =>
						it.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries))
					.Select((it, i) => new EnumViewModel(it, i == 0))
					.ForEach(it => Items.Add(it));

				// update value again...
				Value = Value;
				OnValueChanged();

				UpdateHeight();
			}
		}

		protected virtual void UpdateHeight()
		{
			Height = Items.Count * 25;
			if (Height < 50)
				Height = 50;
		}

		public ObservableCollection<EnumViewModel> Items { get; private set; }

		private int _value;
		[Doc(Summary = "TODO: Starts with 0")]
		public int Value
		{
			get { return _value; }
			set
			{
				if (value == _value)
					return;

				if (value >= Items.Count)
					value = Items.Count - 1;

				var i = 0;
				foreach (var it in Items)
				{
					it.IsSelected = (i == value);
					i++;
				}

				_value = value;
				OnValueChanged();
				OnPropertyChanged("Value");
				WasChangedByUser = true;
			}
		}

		protected virtual void OnValueChanged() { }

		private void CycleNextEnum()
		{
			Value = (_value + 1 >= Items.Count)
				? 0
				: _value + 1;
		}

		private void CyclePreviousEnum()
		{
			if (Items.Count == 0)
				return;

			Value = (_value - 1 < 0)
				? Items.Count - 1
				: _value - 1;
		}

		protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
		{
			EnableBindToMe = false;
			CaptureMouse();
			CycleNextEnum();
			e.Handled = true;
		}

		protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e)
		{
			EnableBindToMe = true;
			ReleaseMouseCapture();
			e.Handled = true;
		}

		protected override void OnPreviewMouseRightButtonDown(MouseButtonEventArgs e)
		{
			EnableBindToMe = false;
			CaptureMouse();
			CyclePreviousEnum();
			e.Handled = true;
		}

		protected override void OnPreviewMouseRightButtonUp(MouseButtonEventArgs e)
		{
			EnableBindToMe = true;
			ReleaseMouseCapture();
			e.Handled = true;
		}
	}
}
